<?php
	include_once('View.php');
		
	/**
	 * Clase Controlador, esta clase es una de las principales ya que 
	 * los controladores heredan de los atributos y metedos de estas clase.
	 * 
	 * @author Miguel Angel Villanueva Rengifo.
	 * @version 0.1
	 * @package clases-generales
	 *
	 */
	class Controlador{
		
		/**
		 * Numero de pagina de la Grilla.
		 *
		 * @var integer
		 * @access protected
		 */
		protected $pagina;
		
		/**
		 * Numero de elementos de la pagina.
		 *
		 * @var integer
		 * @access protected
		 */
		protected $numero_elementos;
		
		/**
		 * Total de elementos de la Grilla.
		 * 
		 * @var integer
		 * @access protected
		 */
		protected $total_elementos;
		
		/**
		 * Campo que se usara para ordenar.
		 *
		 * @var string
		 * @access protected
		 */
		protected $order_by;
		
		/**
		 * Sentido para ordernar: Ascendente o Descendente.
		 *
		 * @var string
		 * @access protected
		 */
		protected $order;
		
		/**
		 * Constructor de la clase Contralador.
		 * @access public
		 *
		 */
		public function __construct(){
			
		}
		
		/**
		 * Funcion para asignar valores a las variables que se usaran para paginar la Grilla.
		 *
		 */
		protected function SetParsPaginacion(){
			$this->pagina=empty($_REQUEST['page'])?1:$_REQUEST['page'];
			$this->numero_elementos=empty($_REQUEST['page'])?15:$_REQUEST['rp'];
			$this->order_by=empty($_REQUEST['sortname:'])?'datetime':$_REQUEST['sortname:'];
			$this->order=$_REQUEST['sortorder'];
		}
		
		/**
		 * Devuelve un array con formato Json.
		 *
		 * @param array $elementos Arreglo con los datos de los registros.
		 * @param string $name_table Nombre de la Tabla principal.
		 * @param array $hiden_field Arreglos con los campos que se va ha considerar 
		 * en el arreglo con formato Json.
		 * @return array
		 */
		protected function GetDataJson($elementos,$name_table,$hiden_field=array()){
			$data_json['page'] = $this->pagina;
			$data_json['total'] = $this->total_elementos;
			$data_json['rows'] = array();
			
			$datos=array();
			$key_field=Doctrine_Core::getTable($name_table)->getIdentifier();
			foreach ($elementos as $elmento){
				$cell=array();
				foreach ($elmento as $key=>$valor){
					if(!in_array($key,$hiden_field)){
						//$cell[]=Util::LimpiarEspacios($valor);
						if(!is_array($valor))
							$cell[]=utf8_encode($valor);
						else
							$this->ExtraGetDataJson($valor,&$cell,$hiden_field);
					}
					
				}
				$valor_key='';
				if(!is_array($key_field))
					$valor_key=$elmento[$key_field];
				else {
					foreach ($key_field as $field){
						$valor_key.=$elmento[$field];
					}
				}
				
				//print_r($cell);
				$datos[]=array('id'=>$valor_key,'cell'=>$cell);
			}
			
			$data_json['rows']=$datos;
			echo json_encode($data_json);
			//return json_encode($data_json);
		}
		
		private function ExtraGetDataJson($arreglo,$cell,$hiden_field=array()){
			foreach ($arreglo as $key=>$valor){
				if(!in_array($key,$hiden_field)){
					if(!is_array($valor))
						$cell[]=utf8_encode($valor);
					else
						$this->ExtraGetDataJson($valor,&$cell,$hiden_field);
				}
			}
		}
		
		private function getFieldsKey(){
			$key_field=Doctrine_Core::getTable("Productos")->getIdentifierColumnNames();
			return $key_field;
		}	
	
		private function getFieldDesc($name_table,$name_field){
			$desc_field=Doctrine_Core::getTable($name_table)->getColumnDefinition($name_field);
			return $desc_field;
		}
	
		protected  function GenerarWhere($name_table,$campos,$alias='',$union='AND'){
			$cadena_where='';
			foreach ($campos as $etiqueta=>$valor){
				$desc_campo=Controlador::getFieldDesc($name_table,$etiqueta);
				//print_r($desc_campo);
				if(!empty($desc_campo)){
					if($desc_campo['type']=='integer'){
						$cadena_where.="$alias.$etiqueta=$valor $union ";
					}elseif ($desc_campo['type']=='text'){
						$cadena_where.="$alias.$etiqueta LIKE '%$valor%' $union ";
					}else {
						$cadena_where.="$alias.$etiqueta='$valor' $union ";
					}
				}
			}
			return $cadena_where;
		}
		
		/**
		 * Executa consulta sql Arbitrario, devuelve el resultado en forma de Arreglo.
		 *
		 * @param string $query Consulta Sql.
		 * @return array Arreglo con los resgistros de la consulta.
		 */
		protected function ExecutarSql($query){
			$con = Doctrine_Manager::getInstance()->connection();

			$st = $con->execute($query);

			$res = $st->fetchAll();
			return $res;
		}
		
		/**
		 * Verificar que la Sesion del Cliente esta activa.
		 *
		 * @return bool Verdadero en caso exisa sesion, falso en caso contrario.
		 */
		public function SessionActiva(){
			if(!empty($_SESSION['id_tipo_usuario'])){
				return true;
			}else {
				return false;
			}			
		}
		
		/**
		 * Verificar si el Usuario es de tipo Administrador.
		 *
		 * @return bool Verdadero en caso sea Administrador, Falso en caso contrario.
		 */
		public function EsAdministrador(){
			if(Controlador::SessionActiva() && $_SESSION['tipo_usuario']=='a')
				return true;
			else 
				return false;
		}
		
		/**
		 * Recupera el ID o Codigo de Usuario.
		 *
		 * @return integer Codigo o ID.
		 */
		public  function getIdUsuario(){
			return $_SESSION['id_usu'];
		}
		
		/**
		 * Verifica si el Usuario es un Cliente.
		 *
		 * @return bool Verdadero en caso sea un Cliente, Falso en caso contrario.
		 */
		protected function EsCliente(){
			if($this->SessionActiva() && $_SESSION['tipo_usuario']=='c'){
				return true;
			}else{
				return false;
			}
		}
	}
?>